package etcd

import (
	"sync"
	"time"

	"github.com/spf13/viper"
)

/*
ETCD在连接的时候，是一个集群模式，也就是当一个连接失效的时候，会自动换在另一个链接；
这点在监听和注册的逻辑上都是有效的；
唯一需要注册的是当租约到期的时候，如果还想继续注册服务，需要重新生成租约；
然后重新把之前的信息注册上etcd；
所以在EtcdAccess里有一个函数数组用来管理，需要注册信息的方法集合；
这样系统中注册信息只需要运行一次就可以
*/
var (
	etcddb *EtcdAccess
	syncd  *sync.Once
)

func init() {
	syncd = new(sync.Once)

}

func Init() {
	etmd, err := NewEtcdAccess(
		SetEtcdAddrs(viper.GetStringSlice("Etcd.Addrs")...),
		SetEtcdDialTimeout(viper.GetDuration("Etcd.DialTimeout")*time.Second),
		SetEtcdLeaseTTL(viper.GetInt64("Etcd.LeaseTTL")),
	)
	if err != nil {
		panic(err)
	}
	etcddb = etmd
}

//获取etcd实例
func GetEtcd() *EtcdAccess {
	syncd.Do(Init)
	return etcddb
}

//注册服务的方法
type reFunc func() error
